package com.spring.redis.operation.contants;

import cn.hutool.core.util.StrUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * @author zhouyu
 */
@Component
public class RedisKeyUtils {

    public static String PREFIX;

    @Value("${spring.application.name}")
    public void setPrefix(String prefix) {
        PREFIX = prefix + StrUtil.COLON;
    }

    /**
     * 获取String类型实体的缓存key
     *
     * @param clazz 实体类
     * @param key   id或其他key
     * @return String
     */
    public static String getStringKey(Class<?> clazz, String key) {
        return PREFIX + clazz.getSimpleName() + StrUtil.COLON + key;
    }

    /**
     * 获取其他微服务String类型实体的缓存key
     *
     * @param serviceName 微服务名称
     * @param clazz       实体类
     * @param key         id或其他key
     * @return String
     */
    public static String getStringKey(String serviceName, Class<?> clazz, String key) {
        return serviceName + StrUtil.COLON + clazz.getSimpleName() + StrUtil.COLON + key;
    }


    /**
     * 获取String类型自定义缓存key
     *
     * @param className 自定义缓存名称
     * @param key       id或其他key
     * @return String
     */
    public static String getStringKey(String className, String key) {
        return PREFIX + className + StrUtil.COLON + key;
    }

    /**
     * 获取其他微服务String类型自定义缓存key
     *
     * @param serviceName 微服务名称
     * @param className   自定义缓存名称
     * @param key         id或其他key
     * @return String
     */
    public static String getStringKey(String serviceName, String className, String key) {
        return serviceName + StrUtil.COLON + className + StrUtil.COLON + key;
    }

    /**
     * 获取hash类型实体的缓存key
     *
     * @param clazz 实体类
     * @return String
     */
    public static String getHashKey(Class<?> clazz) {
        return PREFIX + clazz.getSimpleName();
    }

    /**
     * 获取hash类型实体的缓存key
     *
     * @param clazz 实体类
     * @return String
     */
    public static String getHashKey(Class<?> clazz, String key) {
        return PREFIX + clazz.getSimpleName() + StrUtil.COLON + key;
    }

    /**
     * 获取hash类型自定义缓存key
     *
     * @param className 自定义缓存名称
     * @return String
     */
    public static String getHashKey(String className, String key) {
        return PREFIX + className + StrUtil.COLON + key;
    }

    /**
     * 获取其他微服务hash类型实体的缓存key
     *
     * @param clazz       实体类
     * @param serviceName 自定义缓存名称
     * @return String
     */
    public static String getServiceHashKey(String serviceName, Class<?> clazz) {
        return serviceName + StrUtil.COLON + clazz.getSimpleName();
    }

    /**
     * 获取其他微服务hash类型自定义缓存key
     *
     * @param serviceName 微服务名称
     * @param className   自定义缓存名称
     * @return String
     */
    public static String getServiceHashKey(String serviceName, String className) {
        return serviceName + StrUtil.COLON + className;
    }

    /**
     * 获取set类型实体的缓存key
     *
     * @param clazz 实体类
     * @return String
     */
    public static String getSetKey(Class<?> clazz, String key) {
        return PREFIX + clazz.getSimpleName() + StrUtil.COLON + key;
    }

    /**
     * 获取Set类型自定义缓存key
     *
     * @param className 自定义缓存名称
     * @return String
     */
    public static String getSetKey(String className, String key) {
        return PREFIX + className + StrUtil.COLON + key;
    }


    /**
     * 获取List类型实体的缓存key
     *
     * @param clazz 实体类
     * @return String
     */
    public static String getListKey(Class<?> clazz, String key) {
        return PREFIX + clazz.getSimpleName() + StrUtil.COLON + key;
    }

    /**
     * 获取List类型自定义缓存key
     *
     * @param className 自定义缓存名称
     * @return String
     */
    public static String getListKey(String className, String key) {
        return PREFIX + className + StrUtil.COLON + key;
    }

    /**
     * 获取List类型实体的缓存key
     *
     * @param clazz 实体类
     * @return String
     */
    public static String getZSetKey(Class<?> clazz, String key) {
        return PREFIX + clazz.getSimpleName() + StrUtil.COLON + key;
    }

    /**
     * 获取List类型自定义缓存key
     *
     * @param className 自定义缓存名称
     * @return String
     */
    public static String getZSetKey(String className, String key) {
        return PREFIX + className + StrUtil.COLON + key;
    }

}
